﻿using WorldView;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System;
using Serialization;
using InterfaceComponents;
using System.Collections.Generic;
using Serialization.Script;
using Microsoft.Xna.Framework;
using DrawableObjects.Actors;
using DrawableObjects.Actors.Weapons;
using GlobalGameClasses;

namespace InSovietRussiaProgrammTestsYou
{
    
    
    /// <summary>
    ///Dies ist eine Testklasse für "WorldTest" und soll
    ///alle WorldTest Komponententests enthalten.
    ///</summary>
    [TestClass()]
    public class WorldTest
    {


        private TestContext testContextInstance;

        /// <summary>
        ///Ruft den Testkontext auf, der Informationen
        ///über und Funktionalität für den aktuellen Testlauf bietet, oder legt diesen fest.
        ///</summary>
        public TestContext TestContext
        {
            get
            {
                return testContextInstance;
            }
            set
            {
                testContextInstance = value;
            }
        }

        #region Zusätzliche Testattribute
        // 
        //Sie können beim Verfassen Ihrer Tests die folgenden zusätzlichen Attribute verwenden:
        //
        //Mit ClassInitialize führen Sie Code aus, bevor Sie den ersten Test in der Klasse ausführen.
        //[ClassInitialize()]
        //public static void MyClassInitialize(TestContext testContext)
        //{
        //}
        //
        //Mit ClassCleanup führen Sie Code aus, nachdem alle Tests in einer Klasse ausgeführt wurden.
        [ClassCleanup()]
        public static void MyClassCleanup()
        {
            GlobalGameValues.Values.achievementsUnlocked = new List<Achievement>();
            GlobalGameValues.Values.content = new ContentCollection();
            GlobalGameValues.Values.difficulty = null;
            GlobalGameValues.Values.errorWriter = null;
            GlobalGameValues.Values.gameTime = new GameTime();
            GlobalGameValues.Values.GlobalStrings = new StringContainer();
            GlobalGameValues.Values.graphicsDevice = null;
            GlobalGameValues.Values.score = new InterfaceComponents.HUDWrapper<int>(new List<InterfaceComponents.HUDComponent>());
            GlobalGameValues.Values.soundPlayer = null;
            GlobalGameValues.Values.spriteBatch = null;
            GlobalGameValues.Values.volume_Music = 0;
            GlobalGameValues.Values.volume_soundEffect = 0;
        }
        //
        //Mit TestInitialize können Sie vor jedem einzelnen Test Code ausführen.
        //[TestInitialize()]
        //public void MyTestInitialize()
        //{
        //}
        //
        //Mit TestCleanup können Sie nach jedem einzelnen Test Code ausführen.
        //[TestCleanup()]
        //public void MyTestCleanup()
        //{
        //}
        //
        #endregion


        

        /// <summary>
        ///Ein Test für "GetClosestElement"
        ///</summary>
        [TestMethod()]
        [DeploymentItem("SirianGame.exe")]
        public void GetClosestElementTest()
        {
            GenericDrawableList list = new GenericDrawableList();
            Actor a = WeaponUpgrade.GET_UPGRADEITEM(Weapon.WeaponType.Laser);
            a.setPosition(new Vector2(0, 5));
            list.addActor(a);
            Actor b = WeaponUpgrade.GET_UPGRADEITEM(Weapon.WeaponType.Missile);
            b.setPosition(new Vector2(5, 0));
            list.addActor(b);
            Actor c = WeaponUpgrade.GET_UPGRADEITEM(Weapon.WeaponType.Missile);
            c.setPosition(new Vector2(4, 3));
            list.addActor(c);
            PrivateObject param0 = new PrivateObject(new World(null, list, null, null));
            World_Accessor target = new World_Accessor(param0);
            Vector2 position = new Vector2(0,0);
            List<Actor> elements = list.getActors();
            Actor expected = a;
            Actor actual;
            actual = target.GetClosestElement(position, elements);
            Assert.AreEqual(expected, actual);
        }
    }
}
